查看原文
其他

内核态eBPF程序实现容器逃逸与隐藏账号rootkit

CFC4N 榫卯江湖 2022-09-24

提示

本文不同于 云原生安全攻防|使用eBPF逃逸容器技术分析与实践,腾讯同学的实现,是用eBPF技术在用户态做hook,实现修改文件等动作,完成逃逸。在此过程中,还是会留下一些日志行为,能被常规HIDS感知捕获,触发告警。

本文是在kernel space内核态,hook内核态函数,更改内核态返回用户态缓冲区数据,达到用户态欺骗的目的。用户态进程拿到被篡改的数据,从而被骗通过认证。在此过程,不改变任何文件、进程、网络行为,不产生日志。常规HIDS、HIPS产品无法感知。

背景

前段时间,调研了业界基于eBPF实现的HIDS类产品,包括Cilium、datadog、tracee、falco等产品。在工程研发上,了解了业界在eBPF技术的应用方式,覆盖场景,实现的安全业务功能等。

在K8S生态下,涌现大批基于eBPF技术实现的集群网络管理插件,比如Calicocilium等。而业务实现网络管理服务是以容器化方式部署,且有需要给这些容器启用SYS_BPF_ADMIN权限以支持eBPF系统调用。

这些业务形态,恰恰给这种攻击手段一个完美的发挥空间。

目的

随着业务形态变化,在强大的eBPF技术下,会给安全上带来什么样的威胁呢?正巧前段时间也看到腾讯@neargle 同学们写的 云原生安全攻防|使用eBPF逃逸容器技术分析与实践 文章,深知eBPF的威胁远比这更可怕,细想其功能覆盖XDP、TC、probe、socket等,每个功能点都能实现内核态的篡改行为,从而使得用户态完全致盲,哪怕是基于内核模块的HIDS,一样无法感知这些行为。
为此,笔者跟大家分享这篇文章,演示eBPF技术的强大,给防御产品HIDS/HIPS预警,尽快完成eBPF相关入侵行为监控的建设,提升IDC的防御检测能力。

原理

既然容器启动时,已经授权启用了eBPF权限,那么理论上可以做任何事情,包括容器逃逸获得宿主机权限、实现超级隐藏的rootkit后门、绕过网络防火墙等。

那么eBPF技术还能做哪些事情呢?为了回答这个问题,我们回顾一下eBPF的hook点

从图中可以看出,eBPF的hook点功能包括以下几部分

  1. 可以在StorageNetwork等与内核交互之前;

  2. 也可以在内核中的功能模块交互之间;

  3. 又可以在内核态与用户态交互之间;

  4. 更可以在用户态进程空间。

这意味着,eBPF技术都可以在这些HOOK点做各种手脚,为所欲为,十分可怕。而更可怕的是,在前两个地方,都是在内核态以及内核态之前做手脚,而现有常见的HIDS都是基于内核里或者用户态做行为监控,这恰恰就绕开了大部分HIDS的监控,且不产生任何日志,简直细思极恐、不寒而栗

演示环境

版本

宿主机系统版本

系统内核版本

  1. root@vmubuntu:/home/cfc4n#uname -a

  2. Linux vmubuntu 5.11.0-41-generic #45-Ubuntu SMP Fri Nov 5 11:37:01 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Linux 发行版

  1. root@vmubuntu:/home/cfc4n#cat /etc/os-release

  2. NAME="Ubuntu"

  3. VERSION="21.04 (Hirsute Hippo)"

  4. ID=ubuntu

  5. ID_LIKE=debian

  6. PRETTY_NAME="Ubuntu 21.04"

  7. VERSION_ID="21.04"

  8. HOME_URL="https://www.ubuntu.com/"

  9. SUPPORT_URL="https://help.ubuntu.com/"

  10. BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"

  11. PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"

  12. VERSION_CODENAME=hirsute

  13. UBUNTU_CODENAME=hirsute

容器引擎版本

docker容器版本为20.10.12,比较新。

  1. root@vmubuntu:/home/cfc4n#docker version

  2. Client: Docker Engine - Community

  3. Version: 20.10.12

  4. API version: 1.41

  5. Go version: go1.16.12

  6. Git commit: e91ed57

  7. Built: Mon Dec 13 11:45:34 2021

  8. OS/Arch: linux/amd64

  9. Context: default

  10. Experimental: true


  11. Server: Docker Engine - Community

  12. Engine:

  13. Version: 20.10.12

  14. API version: 1.41 (minimum version 1.12)

  15. Go version: go1.16.12

  16. Git commit: 459d0df

  17. Built: Mon Dec 13 11:43:42 2021

  18. OS/Arch: linux/amd64

  19. Experimental: false

  20. containerd:

  21. Version: 1.4.11

  22. GitCommit: 5b46e404f6b9f661a205e28d59c982d3634148f8

  23. runc:

  24. Version: 1.0.2

  25. GitCommit: v1.0.2-0-g52b36a2

  26. docker-init:

  27. Version: 0.19.0

  28. GitCommit: de40ad0

镜像版本

容器镜像版本

  1. root@vmubuntu:/home/cfc4n# docker image ls

  2. REPOSITORY TAG IMAGE ID CREATED SIZE

  3. ubuntu21 latest 5355960aa2c5 5 days ago 119MB

  4. ubuntu hirsute d662230a2592 3 weeks ago 80MB

  5. ubuntu latest ba6acccedd29 2 months ago 72.8MB

  6. python 3.7.9-alpine3.11 8b32838a7ca6 11 months ago 41.9MB

环境

系统账号文件hash

  1. root@vmubuntu:/home/cfc4n# md5sum /etc/passwd /etc/shadow

  2. f43a244c13b639a41a8f555b28c1ff27 /etc/passwd

  3. 31dd98746685de12d8b6fb40ef22975e /etc/shadow

演示视频

检测防御

视频演示了eBPF技术的强大,只使用了tracepoint一个bpf prog类型实现容器逃逸与隐藏root的rootkit,不改动任何文件,用户态全程无感知。而eBPF还支持kprobe/kretprobe、uprobe/uretprobe、XDP、TC、socket、cgroup等程序类型,覆盖文件、网络、socket、syscall等事件,都是可以被黑客利用的地方。
比如,在XDP层实现一个IP转换,利用http(80端口)来透传sshd(22端口)的通信,完成绕过防火墙的目的,而主机的网络防火墙完全感知不到,更无法溯源出网络通信来源,就问你,可怕不可怕?

那针对这些威胁,站在防御者角度,该如何防范?eBPF实现的rootkit不同于常规rootkit,本身不改变函数地址、代码,防御检测的思路会有什么差别呢?

笔者近期将在「美团安全应急响应中心」微信公众号跟大家分享,敬请期待。

最后

临近元旦,祝大家玩得开心,我们…节后见。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存